<?php

namespace app\api\core;

use cm;
use yii\helpers\Url;
use yii\web\Controller;
use yii;
include_once __DIR__."/../../api/wechat/wxBizMsgCrypt.php";
include_once __DIR__."/../../api/wechat/auth.class.php";
class BaseController extends Controller
{
    public $layout = false;

    public function beforeAction($action)
    {
        $this->auth();//权限验证
        return true;
    }

    /**
     * 权限认证
     * @return bool
     */
    private function auth()
    {
        $noAuth = ['api/main/doc', 'api/main/wx_back', 'api/main/index','api/main/wx_auth','api/main/wx_auth_test','api/main/wx_auth_ceshi'];
        $route = strtolower(Yii::$app->controller->route);
        if (in_array($route, $noAuth)) {
            return true;
        }

        Cm::$app->log->access();
        $appid = Cm::$req->get('appid');
        $sign = Cm::$req->get('sign');
        $time = (int)Cm::$req->get('time', ['reg' => '/^\d{10}$/']);

        $apps = Yii::$app->params['api-accounts'];
        $app = false;
        foreach ($apps as $item) {
            if ($item['appid'] == $appid)
                $app = $item;
        }

        if (!$app)
            Cm::$res->error('app 未找到！');


        $_sign = $this->getSign($app, $time);
        if ($sign != $_sign)
            Cm::$res->error('sign 错误！');

        $curTime = time();
        if ($time < ($curTime - 24 * 60 * 60) && $curTime < $time)
            Cm::$res->error('接口已失效！');

        if (Yii::$app->request->method != 'POST')
            Cm::$res->error('只能POST访问');

        define('APP', json_encode($app));

    }

    /**获取get数据
     * @param $key
     * @param null $default
     * @return array|mixed
     */
    public function get($key=null, $default = null)
    {
        return !empty($key) ?  Yii::$app->request->get($key, $default) : Yii::$app->request->get();
    }

    /**获取post数据
     * @param $key
     * @param null $default
     * @return array|mixed
     */
    public function post($key=null, $default = null)
    {
        if (!empty($key))
            return Yii::$app->request->post($key, $default);
        else
            return Yii::$app->request->post();
    }

    private function getSign($app, $time)
    {
        $data['appid'] = $app['appid'];
        $data['appkey'] = $app['appkey'];
        $data['time'] = $time;
        ksort($data);

        $str = "";
        foreach ($data as $k => $v) {
            if (empty($str))
                $str .= "{$k}={$v}";
            else
                $str .= "&{$k}={$v}";
        }
        $sign = sha1($str);

        return $sign;
    }
    /**
     * 返回数组中指定的一列
     * @param $input            需要取出数组列的多维数组（或结果集）
     * @param $columnKey        需要返回值的列，它可以是索引数组的列索引，或者是关联数组的列的键。 也可以是NULL，此时将返回整个数组（配合index_key参数来重置数组键的时候，非常管用）
     * @param null $indexKey    作为返回数组的索引/键的列，它可以是该列的整数索引，或者字符串键值。
     * @return array            返回值
     */
    function _array_column($input, $columnKey, $indexKey = null)
    {
        if (!function_exists('array_column')) {
            $columnKeyIsNumber = (is_numeric($columnKey)) ? true : false;
            $indexKeyIsNull = (is_null($indexKey)) ? true : false;
            $indexKeyIsNumber = (is_numeric($indexKey)) ? true : false;
            $result = array();
            foreach ((array)$input as $key => $row) {
                if ($columnKeyIsNumber) {
                    $tmp = array_slice($row, $columnKey, 1);
                    $tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : null;
                } else {
                    $tmp = isset($row[$columnKey]) ? $row[$columnKey] : null;
                }
                if (!$indexKeyIsNull) {
                    if ($indexKeyIsNumber) {
                        $key = array_slice($row, $indexKey, 1);
                        $key = (is_array($key) && !empty($key)) ? current($key) : null;
                        $key = is_null($key) ? 0 : $key;
                    } else {
                        $key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
                    }
                }
                $result[$key] = $tmp;
            }
            return $result;
        } else {
            return array_column($input, $columnKey, $indexKey);
        }
    }

    /**
     * PHP  uuid生成
     * @param string $prefix
     * @return string
     */
    public function uuid($prefix = '')
    {
        $chars = md5(uniqid(mt_rand(), true));
        $uuid  = substr($chars,0,8) . '-';
        $uuid .= substr($chars,8,4) . '-';
        $uuid .= substr($chars,12,4) . '-';
        $uuid .= substr($chars,16,4) . '-';
        $uuid .= substr($chars,20,12);
        return $prefix . $uuid;
    }

}
